perm filename MUSF4.F4[MUS,SYS] blob
sn#165228 filedate 1975-07-29 generic text, type T, neo UTF8
00100 C ***** MUSF4 JUN 15 75 -- WRITES ON MAGTAPE OR DSK.
00200 C** LOAD WITH MUSIO.REL, MUSIC.REL, (%LTVRLIB for DD display) ****
00300 C TO WRITE ON DSK: BIGBIT←1; OR RCDFLG←1; TO WRITE ON TAPE: BIGBIT←-1;
00400 C BIGBIT←>1; WRITES ON DSK, 4TH LETTER OF NAME IS SET BY NUMBER.
00500 C IF RCDFLG IS NOT 0 OR 1, ONE LONG FILE IS WRITTEN. PLAY WITH 'PLAY'.
00600 SUBROUTINE SMPLS(LSBUF,ISBCNT,IBOTT,MAXAMP,BIGBIT,RCDFLG)
00700 COMMON JSB(10) /NM/INM(3),MQ(3)
00730 C*** COMMON /NICCOM/ NICNAM
00735 C*** TAKE OUT NICCOM IN MAIN PROG. AND HERE SOMETIME!
00740 CC*** DATA NICNAM /'MUSAA'/
00800 DIMENSION MX(3),IBOTT(1)
00900 EQUIVALENCE(JSB(3),JSB3),(JSB(4),JSB4),(JSB(5),JSB5),(JSB2,JSB(2))
01000 DATA MX/'AMPL.=0 / '/,INM(2)/' AMP='/
01200 DATA JSAVE/33000/
01300 IF(J)GO TO 6
01400 86 K=-1
01500 IEND=-1
01510 RCX=.001
01600 LNM=0
01700 NUM=0
01710 KR=0
01720 JSC=0
01800 IMAX=50000
01900 IF(BIGBIT.EQ.0)GO TO 8
01905 KBIT=2
01910 KR=BIGBIT
02000 IF(RCDFLG.GT.8000)JSAVE=RCDFLG
02010 C WILL SAVE AFTER C.33K UNLESS RCDFLG>8K
02100 RCDFLG=0
02200 RCX=.5
02300 CC***87 IF(BIGBIT.LT.0)GO TO 88
02400 CC*** IF(BIGBIT.LT.1)GO TO 8
02500 CC*** JSC=BIGBIT-1.
02600 CC*** LNM='MUSAA'+256*JSC
02700 CC*** BIGBIT=.5
02800 CC***C NAME CHANGE ONLY WORKS WHEN WRITING ON DSK.
02900 CC*** J=0
03000 CC*** GO TO 87
03100 CC***88 K=0
03300 CC*** KBIT=2
03320 IF(KR.NE.0)J=0
03340 IF(BIGBIT.GT.0)GOTO 88
03350 K=0
03360 RCX=-RCX
03370 88 BIGBIT=RCX
03380 GO TO 9
03500 CC***8 KBIT=3.-BIGBIT
03510 8 KBIT=3
03519 IF(KR.EQ.0)KR=RCDFLG
03520 IF(RCD.NE.RCDFLG)J=0
03523 C FOR ALPHABET SHIFTING
03524 IF(RCDFLG)RCX=-RCX
03525 IF(RCDFLG.NE.-1)RCDFLG=RCDFLG+RCX
03527 C SO THAT FIRST OF A GROUP MAY BE REPEATED.
03530 RCD=RCDFLG
03560 CC**** IF(KR)KR=0
03600 CC**** IF(RCDFLG.GT.1.)RCDFLG=-1.
03700 9 IF(RCDFLG.GE.0)IBOTT(1024)=0
03800 CC*** JSB(2)=KBIT
03900 C KBIT=3, 12-BITS. KBIT=2, 18-BITS. JSB(2) PASSES IT TO CONVRT.
04000 IF(J.EQ.1)GO TO 5
04100 CC**** JNM=NICNAM
04200 CC**** IF(LNM.NE.0)JNM=LNM
04300 CC****1 INM(1)=JNM
04310 IF(KR)KR=-KR
04320 JSC=(KR-1)/26
04330 C ALPHABET SHIFTING
04340 KR=MOD(KR-1,26)
04350 JNM='MUSAA'+256*JSC
04360 1 INM(1)=JNM+KR*2
04400 CC*** KNM=JNM
04450 KNM='MUSAA'
04500 J=1
04600 5 IF(INM(1).LE.JNM+50)GO TO 2
04700 JNM=JNM+256
04800 IF(JNM.LE.KNM+6400)GO TO 3
04900 KNM=JNM+26112
05000 JNM=KNM
05100 C RAISES 'MUSZA' TO 'MUTAA'
05200 3 INM(1)=JNM
05300 C NAMES GO FROM 'AAAAA' TO 'AAZZZ' IF KNM='AAAAA': ELSE MUSAA TO MUZZZ.
05400 CX2 IF(K)GO TO 933
05410 2 IF(K)GO TO 33
05500 CALL GETTAP
05600 GO TO 34
05602 CX331 IF(RCDFLG.EQ.-1)INM(1)='MUSIC'
05604 C RCDFLG=-1 TO -.001 'MUSIC' IS THE NAME
05605 CX CALL PUTMUS(INM(1))
05606 CX CALL PRTNM
05608 C FILE NAME WILL PRINT TWICE--- BEFORE AND AFTER WRITING.
05609 CX GO TO 34
05610 CX933 IF(RCDFLG)GO TO 331
05620 C IF RCDFLG = -1 SET NAME TO 'MUSIC'
05700 33 CALL PUTFIL(INM(1))
05750 CALL PRTNM
05800 34 J=-1
05850 JSC=LSBUF
05875 C IF RCDFLG←-1; LSBUF=1024 -- OTHERWISE LSBUF=1023 AND LAST WD(1024) IS AMP.
05900 IF(RCDFLG)GO TO 666
06000 JSC=LSBUF+1
06100 C WRITES LSBUF+1 WDS. THE '+1' WILL HAVE MAXAMP IN LAST BUFFER.
06200 JSB(1)=JSC
06300 JSB3=INM(1)
06340 JSB2=KBIT
06400 JSB4=9999
06500 JSB5=9998
06600 IF(K)GO TO 66
06700 CALL TOTAPE(JSB(1),128)
06800 GO TO 6
07000 666 IMAX=2050
07100 GO TO 6
07200 66 CALL FASTOU(JSB(1),128)
07300 6 IF(ISBCNT.NE.0)GO TO 7
07400 IF(NUM+LSBUF.LT.JSAVE.OR.RCDFLG)GO TO 4
07500 10 IBOTT(JSC)=MAXAMP
07600 IF(MAXAMP.EQ.0)IBOTT(JSC)=1
07700 C IF 0, THEN NO WAY TO FIND END OF FILE IN OTHER PROGS.
07800 5444 IEND=0
07900 GO TO 4
08000 7 IF(RCDFLG)GO TO 5444
08100 IBOTT(LSBUF)=(ISBCNT-1)/KBIT
08200 MAXAMP=-MAXAMP
08300 C LAST WRD OF LSBUF IS USED FOR WDCNT OF FREE SPACE IN LAST BUFFER.
08400 C -MAXAMP TELLS CONVRT IT'S THE LAST BUFFER.
08500 GO TO 10
08600 4 NUM=NUM+LSBUF
08700 IF(MAXAMP.EQ.0)CALL MESS(MX)
08900 IF(MAXAMP.LT.IMAX)GO TO 4444
09000 C IABS(MAXAMP) WON'T WORK 1ST TIME AROUND!!!!!!!⊗⊗⊗⊗⊗⊗⊗⊗⊗⊗⊗
09100 C 49999 IS MAXIMUM AMPL. POSSIBLE (ARBITRARY NUMBER.)
09200 CALL PRTNM
09300 CALL MESS(INM)
09400 CALL PNUM(MAXAMP)
09600 CALL PNUM(MAXAMP)
09700 GO TO 227
09800 4444 IF(K)GO TO 44
09900 CALL TOTAPE(IBOTT(1),JSC)
10000 GO TO 45
10100 44 CALL FASTOU(IBOTT(1),JSC)
10200 45 IF(IEND)RETURN
10300 IF(RCDFLG)GO TO 224
10400 22 JSB(1)=-1
10450 JSB2=KBIT
10500 JSB3=INM(1)
10600 JSB4=9999
10700 JSB5=9998
10800 IF(K)GO TO 222
10900 CALL TOTAPE(JSB(1),128)
11000 C '-1' MARKS END OF THIS BATCH OF DATA.
11100 C '9999' IDENTIFIES IT AS MUSIC DATA WHEN TAPE IS READ.
11200 CALL FINTAP
11300 CALL BACKSP
11400 CALL BACKSP
11500 GO TO 223
11600 224 K=NUM/LSBUF
11700 J=0
11800 NUM=4-K-(K/4*4)
11900 C MAKES MULTIPLES OF 4K.
12000 J=0
12200 2251 DO 225 K=1,1024
12300 225 IBOTT(K)=0
12400 2261 DO 226 K=1,NUM
12500 226 CALL FASTOU(IBOTT(1),LSBUF)
12600 227 CALL FINFIL
12700 GO TO 2221
12800 222 CALL FASTOU(JSB(1),128)
12900 CALL FINFIL
13000 223 J=1
13100 2231 IF(RCDFLG.GE.0)CALL SAVER
13125 CXXX TAKE OUT ABOVE FOR EXPORT.
13150 JSB(1)=0
13200 2221 CALL MESS(INM)
13300 CALL PNUM(MAXAMP)
13400 INM(1)=INM(1)+2
13500 RETURN
13600 END
13700
13710 SUBROUTINE PRTNM
13720 COMMON/NM/INM(3),MQ(3)
13725 DATA MQ(2)/' -- '/
13730 MQ(1)=INM(1)
13740 CALL MESS(MQ)
13750 END
14000
14010 SUBROUTINE READIN(A,B,C,D,E)
14020 C THIS IS A DUMMY. WILL BE DEVELOPED LATER.
14030 END
14040
14100 SUBROUTINE SEG(FUNC)
14200 C TYPE AMPL, STEP# (UP TO STEP 512). SAME FORMAT AS GEN 1 IN MUSIC5.
14300 DIMENSION FUNC(512),A(4)
14400 COMMON K,STEP,AMP1,AMP2,DIF,IT,IS,ST,STPS,RK
14500 DATA (A(K),K=1,3)/'SEG ARRAY FULL/'/
14800 C REMOVE ABOVE LATER******** MAYBE.
15000 AMP1=0
15100 ST=0
15200 1 CALL RDNUM(AMP2)
15300 CALL RDNUM(STEP)
15400 IF(STEP.GT.1.)GO TO 3
15500 AMP1=AMP2
15600 GO TO 1
15700 C STEP=1 AND STEP=0 ARE CONSIDERED THE SAME.
15800 3 DIF=AMP2-AMP1
15900 5 IT=ST
15950 IS=STEP*5.120+.0001
15975 STEP=IS
16000 STPS=STEP-ST
16100 IS=STPS
16150 IF(IS+IT.GT.512)GO TO 6
16200 ST=STEP
16300 IF(ST.EQ.0)STEP=1.
16400 DO 2 K=1,IS
16600 RK=K
16700 2 FUNC(K+IT)=AMP1+DIF*RK/STPS
16800 AMP1=AMP2
16900 ST=STEP
17100 IF(STEP.LT.512)GO TO 1
17300 1102 CALL MESS(A)
17350 IF(NOTDD(K))CALL SEE(FUNC)
17355 C 'NOTDD' CHECKS TO SEE IF ITS A DATADISC DPY.
17400 RETURN
17500 6 K=1
17550 C NEXT TO READ IN FULL ARRAYS
17600 8 CALL RDNUM(RK)
17700 7 FUNC(K)=RK
17800 K=K+1
17900 IF(K.LE.512)GO TO 8
18000 GO TO 1102
18100 END
18200
18300 SUBROUTINE SYNTH (FUNC)
18400 C AFTER 'SYNTH(F1);' TYPE 99= TO USE H,A,P,K: OTHERWISE
18500 C H,A ONLY. TYPE 999 TO END. NORMALIZATION IS AUTOMATIC.
18600 DIMENSION FUNC(512),F(5)
18700 COMMON I,XX,X,H,K,CON,XK,FAC,AMP,Y
18800 DATA (F(I),I=1,4)/'SYNTH ARRAY FULL/'/
18900 DO 15 I=1,512
19000 15 FUNC(I)=0.0
19100 CALL RDNUM(XX)
19200 IF(XX.EQ.99)XX=-99
19300 FAC=360./512.
19400 H=XX
19500 IF(XX)CALL RDNUM(H)
19600 16 CALL RDNUM(AMP)
19700 IF(XX)GO TO 1016
19800 X=0
19900 CON=0
20000 GO TO 2016
20100 1016 CALL RDNUM(X)
20200 X=X*512./360.+1.0
20300 CALL RDNUM(CON)
20400 2016 DO 17 J=1,512
20500 XK=SIND(X*FAC)*AMP+CON
20600 IF(CON.LT.100.0)GO TO 1
20700 FUNC(J)=(XK-100.)*FUNC(J)
20800 GO TO 2
20900 1 FUNC(J)=FUNC(J)+XK
21000 2 X=X+H
21100 IF(X.LE.512.)GO TO 17
21200 X=X-512.
21300 17 CONTINUE
21400 CALL RDNUM(H)
21500 IF(H.NE.999.)GO TO 16
21600 2200 X=FUNC(1)
21700 DO 19 I=2,512
21800 H=ABS(FUNC(I))
21900 19 IF(X.LT.H)X=H
22000 DO 20 I=1,512
22100 20 FUNC(I)=FUNC(I)/X
22200 CALL MESS(F)
22300 IF(NOTDD(K))CALL SEE(FUNC)
22400 END
22500 C *********** DUR2 1969 *********
22550 C*TAKE OUT DUR AND SEE FOR EXPORT**SEE SCORE.MAN FOR USE OF DUR2(X,Y,Z)
22562
22600 FUNCTION DUR(P2,SPEED,CHNS)
22700 COMMON P,ISR,NC,IDUR,ID,IP(5)
22800 DATA IP/20000,25000,10000,50000,100000/
22900 P=P2
23000 ISPD=SPEED
23100 NC=CHNS*30+.3
23200 3 IDUR=P*10000+.5
23300 5 IDUR=(IDUR*IP(ISPD))/1000
23400 6 ID=IDUR/NC
23500 7 ID=IDUR-ID*NC
23600 IF(ID.EQ.0)GO TO 1
23700 P=P+.0001
23800 GO TO 3
23900 1 DUR=P
24000 RETURN
24100 END
24200
24300
24400 SUBROUTINE SEE(FUNC)
24500
24600 CC DIMENSION FUNC(512),SU(150),C(3)
24610 DIMENSION FUNC(512),SU(150)
24700 CC DATA (C(I),I=1,2)/'0=CLEAR: '/
24800 CALL DDCLR
24900 C THIS VERSION MUST BE LOADED WITH %LTVRLIB (FOR 'DDCLR')
25000 CALL TYPLOC(-100,-512)
25100 CALL DPYSET(2,SU,150)
25200 CC CALL DPYBRT(6)
25300 CALL ALINE(-264,200,256,200)
25400 CALL ALINE(-256,-56,-256,456)
25500 CC CALL AIVECT(0,200)
25600 1 IY=FUNC(1)*256.0+200.0
25700 CALL AIVECT(-256,IY)
25800 DO 14 I=2,512,3
25900 IY2=FUNC(I)*256.0+200.0
26000 CALL RVECT(3,IY2-IY)
26100 14 IY=IY2
26200 CALL DPYOUT(2)
26300 CC100 CALL MESS(C)
26400 CC1100 CALL RDNUM(X)
26500 CC CALL DPYCLR
26700 END